创建客户端(默认内存存储,重启后数据消失)
🤖 Assistant
根据你的需求(部署简单、免费、适合个人用户),推荐以下两款向量数据库,并给出详细使用步骤:
推荐选择 1:Chroma(轻量级,适合快速上手)
理由:
- 纯Python实现,无需额外依赖,pip安装即可使用。
- 完全开源免费,支持本地运行,无云服务成本。
- 专为AI应用设计(如LangChain集成),适合RAG等实验场景。
使用步骤
1. 安装Chroma
pip install chromadb # 安装Chroma核心库
pip install sentence-transformers # 可选:用于生成文本嵌入
2. 启动本地Chroma服务
import chromadb
# 创建客户端(默认内存存储,重启后数据消失)
client = chromadb.Client()
# 持久化存储(可选,数据保存到磁盘)
# client = chromadb.PersistentClient(path="./chroma_db")
3. 创建集合(Collection)并插入数据
from sentence_transformers import SentenceTransformer
# 加载嵌入模型(小型BERT模型,适合本地运行)
model = SentenceTransformer('all-MiniLM-L6-v2')
# 创建集合
collection = client.create_collection(name="my_documents")
# 添加文本和嵌入向量
documents = [
"AI is transforming the tech industry.",
"Machine learning requires large datasets.",
"Chroma is a lightweight vector database."
]
embeddings = model.encode(documents).tolist() # 生成嵌入向量
# 插入数据(需提供ID、文本、嵌入向量)
collection.add(
documents=documents,
embeddings=embeddings,
ids=["id1", "id2", "id3"]
)
4. 执行相似性搜索
# 查询与目标文本相似的文档
query = "What is AI's impact on technology?"
query_embedding = model.encode(query).tolist()
results = collection.query(
query_embeddings=[query_embedding],
n_results=2 # 返回Top-2结果
)
# 输出结果
print(results["documents"])
# 示例输出:["AI is transforming the tech industry.", ...]
5. 保存和加载数据(持久化模式)
# 持久化客户端会自动保存数据到磁盘
# 下次启动时用相同路径加载即可恢复数据
# client = chromadb.PersistentClient(path="./chroma_db")
推荐选择 2:FAISS + SQLite(本地高性能方案)
理由:
- FAISS是Meta开源的向量搜索库,性能极高(支持GPU加速)。
- 结合SQLite可低成本实现持久化存储。
使用步骤
1. 安装依赖
pip install faiss-cpu # CPU版本(若用GPU则安装faiss-gpu)
pip install sentence-transformers
2. 创建FAISS索引并存储
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
# 生成示例嵌入向量
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = ["AI is...", "Machine learning...", "Chroma is..."]
embeddings = model.encode(documents)
# 创建FAISS索引(L2距离度量)
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings) # 添加向量
# 保存索引到磁盘
faiss.write_index(index, "my_index.faiss")
3. 加载索引并搜索
# 加载索引
index = faiss.read_index("my_index.faiss")
# 查询向量
query = "What is AI's impact on technology?"
query_embedding = model.encode(query).reshape(1, -1)
k = 2 # 返回2个最近邻
distances, indices = index.search(query_embedding, k)
# 输出结果
print("最相似的文档ID:", indices[0].tolist())
print("距离:", distances[0].tolist())
4. 持久化扩展(结合SQLite)
- 用SQLite存储原始文本和ID,FAISS只存向量。
- 搜索时通过FAISS返回的
indices从SQLite中检索对应文本。
对比总结
| 特性 | Chroma | FAISS + SQLite |
|---|---|---|
| 部署复杂度 | 极简(纯Python) | 中等(需管理索引和数据库) |
| 持久化 | 支持(需显式启用) | 需手动结合SQLite实现 |
| 性能 | 适合小规模数据(<1M向量) | 高性能(支持亿级向量) |
| 适用场景 | 快速原型开发、RAG实验 | 需要高性能搜索的研究项目 |
最终建议
- 优先选择Chroma:如果你的目标是快速验证RAG或语义搜索流程,Chroma的易用性和LangChain集成(
Chroma.from_documents())能极大简化开发。 - 选择FAISS:若需要处理更大规模数据或研究向量搜索算法(如量化、聚类),FAISS更灵活。
两种方案均无需付费,代码示例可直接运行,适合个人研究者!